package s

import (
	"fmt"
	"reflect"
	"strconv"
)

func (self Dict[K, T]) DecodeAsStruct(obj interface{}) {
	v := reflect.ValueOf(obj)

	// 解析字段
	for i := 0; i < v.Elem().NumField(); i++ {

		// 取tag
		field := v.Elem().Type().Field(i)
		tag := field.Tag

		// 解析label 和 default
		label := tag.Get("ini")

		defaultValue := tag.Get("default")
		// c := label.(K)
		found := false
		for key, val := range self {
			if fmt.Sprint(key) == label {
				// fmt.Println("hit:", key, val)
				// if v.CanSet() {
				// fmt.Println("can set")
				if v.Elem().Field(i).Type().Name() == "int" && reflect.TypeOf(val).Name() == "string" {
					ff := reflect.ValueOf(val)
					vali, err := strconv.Atoi(ff.String())
					if err == nil {
						v.Elem().Field(i).Set(reflect.ValueOf(vali))
					}
				} else {
					v.Elem().Field(i).Set(reflect.ValueOf(val))

				}
				// v.Set(reflect.ValueOf(val))
				// }
				found = true
				break
			}
		}
		if !found {
			v.Elem().Field(i).Set(reflect.ValueOf(defaultValue))
		}

	}

}
